# 位置参数
def power(x):
    return x * x


print(power(5))
print(power(2))


# 默认参数(就是参数给默认值)
def funa(name, age, gender='未知'):
    return 'name: %s, age: %s, gender: %s' % (name, age, gender)


print(funa('小王', 18))
print(funa('小李', 20, '男'))


# 可变参数
# *args 得到的是一个tuple(元组)
def calc(*args):
    # 得到的*args是一个tuple（y元组）
    print(type(args))
    print(args)
    sum = 0
    for n in args:
        sum += n
    return sum
print(calc(1, 2, 3, 4, 5))


# 关键字参数
# 得到的是一个dict(字典)
def person(name, age, **kwargs):
    print(type(kwargs))
    print(kwargs)
    print('name:', name, 'age:', age, 'other:', kwargs)
person('小王', 18, city='上海', job='程序员')
person('小王', 18, city='上海', job='程序员', country='中国')
person('小王', 18, city='上海', job='程序员', country='中国', sex='男')
print('-' * 100)

# 命名关键字参数(使用 * 来限制命名关键字参数)
# 对于关键字参数，函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些，就需要在函数内部通过kw检查。但是调用者仍可以传入不受限制的关键字参数：
def person2(name, age, *, city, job):
    print('name:', name, 'age:', age, 'city:', city, 'job:', job)
person2('小王', 18, city='上海', job='程序员')
person2('李四', 28, city='厦门', job='做牛马')
# person2('小王', 18, city='上海', job='程序员', country='中国') # TODO 不会有任何输出, 因为country不是命名关键字参数

# 参数组合
'''
在Python中定义函数，可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数，这5种参数都可以组合使用。但是请注意，参数定义的顺序必须是：必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
比如定义一个函数，包含上述若干种参数：
def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

def f2(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
'''